<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>buffer(缓冲)类</title>
</head>
<body>
	<p>buffer类可以在TCP或文件系统操作等场景处理二进制数据</p>
	<p>Buffer的大小在其创建时就已确定，且不能改变大小。</p>
	<p>Buffer类的实例类似于整数数组。其大小固定，并在V8堆外分配物理内存。</p>
	<p>new Buffer() 的行为会根据所传入的第一个参数的值的数据类型而明显地改变。new buffer()构造函数已被废弃</p>
	<p>Buffer.from(array)：返回一个新建的包含所提供的字节数组的副本Buffer。------->也就是说这种方法会返回一个副本Buffer，并且里面包含之前的array。</p>
	<p>Buffer和字符串可以互相转换</p>
	<p>Buffer可以通过[index]方式直接修改某个位置的字节。</p>
	<p>.slice方法也不是返回一个新的Buffer，而是直接修改.silce指针指向位置的字节。</p>
</body>
<script type="text/javascript">
	// 创建一个长度为10，且用0填充的Buffer。
	const buf1 =  Buffer.alloc(10);
	// 创建一个长度为10，且用0x1 填充的 Buffer。
          const buf2 = Buffer.alloc(10, 1);
	// 创建一个长度为 10、且未初始化的 Buffer。
	// 这个方法比调用 Buffer.alloc() 更快，
	// 但返回的 Buffer 实例可能包含旧数据，
	// 因此需要使用 fill() 或 write() 重写。
	const buf3 = Buffer.allocUnsafe(10);
	// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
	const buf4 = Buffer.from([1, 2, 3]);
	// 创建一个包含 ASCII 字节数组 [0x74, 0x65, 0x73, 0x74] 的 Buffer。
	const buf5 = Buffer.from('test');
	// 创建一个包含 UTF-8 字节数组 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
	const buf6 = Buffer.from('tést', 'utf8');


	// Buffer和字符串可以互相转换
	var bin = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]);
	var str = bin.toString("utf-8");  //----->hello

	var bin = new Buffer('hello', 'utf-8'); // ---><Buffer 68 65 6c 6c 6f>

	// .slice方法也不是返回一个新的Buffer，而是直接修改.silce指针指向位置的字节。
	var bin = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]);
	var sub = bin.slice(2);
	sub[0] = 0x65;
	console.log(bin); // => <Buffer 68 65 65 6c 6f>

          // 如果想要拷贝一份Buffer，得首先创建一个新的Buffer，并通过.copy方法把原Buffer中的数据复制过去。这个类似于申请一块新的内存，并把已有内存中的数据复制过去。
          var bin = new Buffer([0x68,0x65,0x6c,0x6c,0x6f]);
          var dup = new Buffer(bin.length);

          bin.copy(dup);
          dup[0] = 0x48;
          console.log(bin);   // => <Buffer 68 65 6c 6c 6f>
          console.log(dup);   // => <Buffer 48 65 65 6c 6f>
</script>
</html>